/*
 * anh.h
 *
 *  Created on: 17 sept. 2013
 *      Author: the
 */
#ifndef ANH_H_
#define ANH_H_

#include "type.h"
#include "metric.h"
#include "init.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

//indicates if the node id1 is in the 3-neighborhood of node id2
//return 1 if yes and 0 otherwise
int is3Neighbor(int id1, int id2);

//Return 1, s'il y a juste la frequence de noeud "emetteur" vers "recepteur" sur une route active
// et il n'exist pas la route de noeud "recepteur" vers "emetteur"
//Si non, returns 0.
int linkIsDirectionnel(int emetteur, int recepteur);

//Return 1 if the frequency "frequency" is used between the nodes "emetteur" and "recepteur" for an active route
//Otherwise, returns 0.
int linkFrequencyRouteDirectionnel(int emetteur, int recepteur, int frequency);

//Compute the conflict graph for a link bidirectional with a conflict at 3 hops for an active route.
int conflictGraphLink2(int id1, int id2, int frequency);

//Compute the conflict graph for a link directional with a conflict at 3 hops for an active route.
int conflictGraphLink3(int id1, int id2, int frequency);


////////////////////////////////////////////////////////////
// 	Algorithme : l'assignation des fréquences en réseau   //
////////////////////////////////////////////////////////////

// Des prototypes
void allocateEmptyFrequency(); //Alloue la meme frequence vide partout (frequence -1) et sur la meme radio (-1) les autres radios ne sont pas alloues
int conflictGraphGeneric(int vertex1, int vertex2); // Nous calculons le conflict directionnel ou bidirectionnel ici
float calculMinCapaciteChemin(int pathNumber); // Rechercher la plus petite capacité sur le chemin pathNumber
float calculCapaciteReseau(int nbOfRoutes); // Calculer la capacité du réseau
int updateFreq(int vertex1, int vertex2, int frequence); // Changer la fréquence entre deux noeuds vertex1 et vertex2. Returner -1, s'il est impossible
float assignationLien(int vertex1, int vertex2,int nbOfRoutes); // Trouver la fréquence pour le lien (vertex1,vertex2) qui nous donne la plus grande capacité soit supérieure à la capacité du réseau en cours
int existLienSurRoute(int vertex1, int vertex2,int pathNumber); // Vérifier que le lien (vertex1,vertex2) exist déjà sur la route pathNumber . Si oui, retourner 1. Si non, retourner -1
int existJusteLien(int vertex1, int vertex2,int pathNumber, int nbOfRoutes); // Vérifier que le lien (vertex1,vertex2) appartient juste la route 'pathNumber'. Si oui, retourner 1. Si non, retourner -1
void initialisationChemin(int pathNumber,int nbOfRoutes); // On remet la fréquence vide aux liens sur le chemin pathNumber
void affichageReseau(); // Afficher tous les liens conflict sur les routes

int countFrequency( int vertex1, int freq); 	// compter le nombre de 'freq' qui avait utilisé sur le noeud vertex1
int countRadio ( int vertex1 );// compter le nombre de radio qui avait utilisé sur le noeud vertex1

//Allocate the frequency to the nodes
//nbOfRoutes is number routing between node source and destination
void allocateFrequencyAnh(int nbOfRoutes);


#endif /* ANH_H_ */
